'''
【题目】
试题 B: 寻找整数
本题总分:5分

[问题描述 ]
有一个不超过 1017的正整数 n，知道这个数除以 2至 49 后的余数如下表所示，求这个正整数最小是多少。
[答案提交]
    这是一道结果填空的题，你只需要算出结果后提交即可。
    本题的结果为一个由大写字母组成的字符串，在提交答案时只填写这个字符串，填写多余的内容将无法得分。
'''


# 方法一
'''
time+=30min
value+=5分
这题如果上来没想法建议直接跳过，5分写个半小时还是有点亏的，写不出来就更加亏了
看到网上还有个方法使用了中国剩余定理，看了半天没太懂，这题有点狗血

'''

'''
import os
import sys
dp = [(2, 1), (3, 2), (5, 4), (7, 4), (13, 10), (19, 18), (23, 15), (29, 16), (31, 27), (37, 22), (41, 1), (47, 5)]//质数列表
lcm = 187  # 最小公倍数
ans = 187
i = 0
while i < len(dp):
    if ans % dp[i][0] == dp[i][1]:  # 满足条件
        lcm *= dp[i][0]  # 乘到lcm上
        i += 1  # 次数+1
    else:
        ans += lcm  # 不满足就+lcm继续检验
print(ans)
'''




# 方法二
'''
【思路点拨】
第二题，难度直接起飞！第一题就是个幌子，第二题开始光明正大的上难度了。

接下来拿出新手必会的大杀器来做——暴力解法！
暴力求解谁都会，关键是什么？如何优化代码，能在比赛的2小时内跑完程序。
最好的方法就是找规律，发现数据之间的联系
~

从枚举一个个数据：每次 + 1
到枚举一批批的数据：每次 + 38137680
速度直接起飞
~

暴力三步走：
1.
枚举数据找规律：取表后面5个大数判断更容易找到大数据，得到关键数据。
2.
找出规律求公式：这些数字是按判断求得的，所以一定存在公式。
3.
遍历公式找答案：通过公式进行快速遍历，30
s轻松找到十六位数的答案。
'''

# 1.枚举数据找规律
i = 1
while True:
    flag = True
    if i % 49 != 46:
        flag = False
    if i % 48 != 41:
        flag = False
    if i % 47 != 5:
        flag = False
    if i % 46 != 15:
        flag = False
    if i % 45 != 29:
        flag = False
    if flag:
        print(i)
    i += 1
'''
4772009
42909689
81047369
119185049
157322729
···
'''
# 2.找出规律求公式
a = [4772009, 42909689, 81047369, 119185049, 157322729]
# 发现存在等差数列
print(a[1] - a[0])  # 38137680
print(a[2] - a[1])  # 38137680
print(a[3] - a[2])  # 38137680
k = 38137680
b = 4772009
# 求出公式
y = k * x + b
# 3.遍历公式找答案
# 题目数据
mod = [(2, 1), (14, 11), (26, 23), (38, 37),
       (3, 2), (15, 14), (27, 20), (39, 23),
       (4, 1), (16, 9), (28, 25), (40, 9),
       (5, 4), (17, 0), (29, 16), (41, 1),
       (6, 5), (18, 11), (30, 29), (42, 11),
       (7, 4), (19, 18), (31, 27), (43, 11),
       (8, 1), (20, 9), (32, 25), (44, 33),
       (9, 2), (21, 11), (33, 11), (45, 29),
       (10, 9), (22, 11), (34, 17), (46, 15),
       (11, 0), (23, 15), (35, 4), (47, 5),
       (12, 5), (24, 17), (36, 29), (48, 41),
       (13, 10), (25, 9), (37, 22)]
# 遍历公式
x = 0
k = 38137680
b = 4772009
while True:
    flag = True
    y = k * x + b
    for i, j in mod:
        if y % i != j:
            flag = False
            break
    if flag == True:
        print(y)  # 2022040920220409
        break
    x += 1





